/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package matematicadiscretaxml;

import arbol_prueba.BTree;
import java.util.ArrayList;

/**
 *
 * @author diego
 */
public class Actualizacion {
 
    private ArrayList lista_lexemas = new ArrayList();

    ObjetoQuery tabla_obj_query[][] = new ObjetoQuery[0][0];//TABLA QUE RESULTA DEL PRODUCTO CARTESIANO
    ObjetoQuery vector_select[] = new ObjetoQuery[0];//VECTOR DE CAMPOS DEL SELECT
    ArrayList lista_errores_actualizacion = new ArrayList();//GUARDA LOS ERRORES
    ArrayList<ObjetoQuery> lista_valores_actualizar = new ArrayList();//GUARDA LOS ERRORES

    OperacionesArchivoXML obj_opera_en_xml = new OperacionesArchivoXML();

    ArrayList<DefinicionTabla> lista_def_columnas = new ArrayList();/* AQUI SE GUARDA LAS COLUMNAS QUE DEFINEN LA TABLA */

    public Actualizacion(){}

    public Actualizacion(ArrayList _lista_lexemas)
    {
        lista_lexemas = _lista_lexemas;
    }

    public void generarArbolSintacticoActualizacion()
    {
        Update obj_update = new Update(lista_lexemas);
        Set obj_set = new Set(lista_lexemas);
        Where obj_where = new Where(lista_lexemas);
        BTree sub_arbol_update = null;
        BTree sub_arbol_set = null;
        BTree sub_arbol_where = null;

        System.out.println("**************************************************************");
        obj_update.ingresarPilas();
        sub_arbol_update = obj_update.generarSubArbolUpdate(new BTree("nulo"));
        lista_errores_actualizacion.addAll(obj_update.getlista_errores_update());
        if(lista_errores_actualizacion.isEmpty())
        {
            sub_arbol_update.imprimePostOrden();
            System.out.println("**************************************************************");
            obj_set.ingresarPilas();
            sub_arbol_set = obj_set.generarSubArbolSet(new BTree("nulo"));
            lista_errores_actualizacion.addAll(obj_set.getlista_errores_set());
            if(lista_errores_actualizacion.isEmpty())
            {
                sub_arbol_set.imprimePostOrden();
                System.out.println("**************************************************************");
                obj_where.ingresarPilas();
                if(!obj_where.pila_pal_reserv.empty())
                {
                    sub_arbol_where = obj_where.generarSubArbolWhere(new BTree("nulo"));
                    lista_errores_actualizacion.addAll(obj_where.getLista_errores_where());
                    if(lista_errores_actualizacion.isEmpty())
                    {
                        sub_arbol_where.imprimePostOrden();
                        if(lista_errores_actualizacion.isEmpty())
                        {
                            ejecutarUpdate(sub_arbol_update,sub_arbol_set,sub_arbol_where);
                        }
                    }
                }
                else
                {
                    ejecutarUpdate(sub_arbol_update,sub_arbol_set, null);
                }
            }
        }
    }

    public void ejecutarUpdate(BTree sub_arbol_update, BTree sub_arbol_set, BTree sub_arbol_where)
    {
        recorrerSubArbolUpdate(sub_arbol_update);
        if(lista_errores_actualizacion.isEmpty())
        {
            if(sub_arbol_where != null)
            {
                recorrerSubArbolWhere(sub_arbol_where, sub_arbol_update);
            }
            if(lista_errores_actualizacion.isEmpty())
            {
                recorrerSubArbolSet(sub_arbol_set, sub_arbol_update);
                if(!lista_errores_actualizacion.isEmpty())
                {
                    tabla_obj_query = new ObjetoQuery[0][0];
                }
                else
                {
                    /*
                     * AQUI SE EFECTUA LA ACTUALIZACION EN LOS ARCHIVOS
                     */
                    lista_errores_actualizacion.addAll(obj_opera_en_xml.verificarIntegridadReferencial(tabla_obj_query,lista_valores_actualizar));

                    if(lista_errores_actualizacion.isEmpty())
                    {
                        XML obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                        lista_valores_actualizar.get(0).getTabla().toLowerCase() +"_dat.xml");
                        obj_xml.modificarRegistroXML(tabla_obj_query, lista_valores_actualizar);

                        imprimirMatriz(tabla_obj_query);

                        for(int i = 0; i<lista_def_columnas.size(); i++)
                        {
                            System.out.println(lista_def_columnas.get(i).getNombre_tabla()
                                                +" | "+lista_def_columnas.get(i).getNombre()
                                                +" | "+lista_def_columnas.get(i).getTipo_dato()
                                                +" | "+lista_def_columnas.get(i).getPrimaria()
                                                +" | "+lista_def_columnas.get(i).getForanea()
                                                +" | "+lista_def_columnas.get(i).getTabla_referencia());
                        }

                        for(int i = 0; i<lista_valores_actualizar.size(); i++)
                        {
                            System.out.println("LO Q SE VA A ACTUALIZAR: "+lista_valores_actualizar.get(i).getObjeto());
                        }
//                        System.out.println("TODO BIEN !!! ");
                    }
                    else
                    {
//                        System.out.println("fallo referencial");
                        tabla_obj_query = new ObjetoQuery[0][0];
                    }

                }
            }
            else
            {
                tabla_obj_query = new ObjetoQuery[0][0];
            }
        }
        else
        {
            tabla_obj_query = new ObjetoQuery[0][0];
        }
    }

    public void imprimirMatriz(ObjetoQuery[][] matriz)
    {
        System.out.println("************** ACTUALIZACION ****************");
        for(int i = 0; i<matriz.length; i++)
        {
            for(int j = 0; j<matriz[0].length; j++)
            {
                System.out.print(matriz[i][j].getObjeto()+" | ");
            }
            System.out.println("");
        }
        System.out.println("*********************************************");
    }

    public void recorrerSubArbolSet(BTree nodo, BTree nodo_update )
    {
        if( nodo.getIzquierda()!= null )
        {
            recorrerSubArbolSet(nodo.getIzquierda(), nodo_update);
        }
        if(nodo.getDerecha() != null)
        {
            recorrerSubArbolSet(nodo.getDerecha(), nodo_update);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            int num_repitencias = 0;
            switch(buscarPuntoCadena(((Lexema)nodo.getElement()).getLexema()))
            {
                case 0:
                    num_repitencias = obj_opera_en_xml.buscarCamposEnArbol(nodo_update, ((Lexema)nodo.getElement()).getLexema());

                    if(num_repitencias > 1 )
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN UPDATE"));
                    }
                    else if(num_repitencias == 0)
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN UPDATE"));
                    }
                    break;

                case 1:
                    String tabla_campo = ((Lexema)nodo.getElement()).getLexema();
//                    System.out.println("PARTE TABLA"+tabla_campo.substring(0, tabla_campo.indexOf('.')));
//                    System.out.println("PARTE CAMPO"+tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() ));
                    num_repitencias = obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1,tabla_campo.length())
                                                                            , tabla_campo.substring(0, tabla_campo.indexOf('.')));

                    if(num_repitencias == 0)
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN UPDATE"));
                    }
                    break;

                default:
                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    break;
            }
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 5)
        {
            /*
             * ACA NO SE HACE NADA PS ES CONSTANTE CADENA
             */
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 6)
        {
            /*
             * ACA NO SE HACE NADA PS ES CONSTANTE NUMERO
             */
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 3)
        {
            if(nodo.getDerecha() != null && nodo.getIzquierda() != null)
            {
                String tabla_campo = "";

                if( (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 5)
                     || (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 5
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4)
                        )
                {
                /*
                 * NOTA: ACA SE DEBE VERIFICAR SI EL CAMPO ES UNA CADENA
                 */
                    String nombre_tabla_ident = null;
                    String nombre_campo_ident = null;
                    String const_cad = null;

                    if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4 )
                    {
                        tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();
                        const_cad = ((Lexema)nodo.getDerecha().getElement()).getLexema().replace("'", "");

                    }
                    else
                    {
                        tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();
                        const_cad = ((Lexema)nodo.getIzquierda().getElement()).getLexema().replace("'", "");
                    }

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("varchar") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo;
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS SET", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);
                                if( tipo_dato_campo.equals("varchar") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length());
                                    /*
                                     * AQUI GENERA LA TABLA PARA ESTE OPERADOR
                                     */
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                        }
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }
                    if(nombre_tabla_ident != null && nombre_campo_ident != null
                            && lista_errores_actualizacion.isEmpty())
                    {
                        /*
                         * ACA SE DEBE IR GUARDANDO LOS VALORES DE INSERCION EN UN ARREGLO ObjQuery
                         */
                        lista_valores_actualizar.add(new ObjetoQuery(nombre_tabla_ident
                                                                        , nombre_campo_ident
                                                                        , const_cad) );
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                    }

                }
                else if( (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 6)
                     || (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 6
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4)
                        )
                {
                /*
                 * NOTA: ACA SE DEBE VERIFICAR SI EL CAMPO ES UN NUMERO
                 */
                    String nombre_tabla_ident = null;
                    String nombre_campo_ident = null;
                    double const_num;

                    if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4 )
                    {
                        tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();
                        const_num = Double.parseDouble(((Lexema)nodo.getDerecha().getElement()).getLexema());
                    }
                    else
                    {
                        tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();
                        const_num = Double.parseDouble(((Lexema)nodo.getIzquierda().getElement()).getLexema());
                    }

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);
                                if( tipo_dato_campo.equals("double") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo;
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS SET", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN UPDATE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN UPDATE"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo =obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);
                                if( tipo_dato_campo.equals("double") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length());
                                    /*
                                     * AQUI GENERA LA TABLA PARA ESTE OPERADOR
                                     */
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS SET", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }
                    if(nombre_tabla_ident != null && nombre_campo_ident != null )
                    {
                        lista_valores_actualizar.add(new ObjetoQuery(nombre_tabla_ident
                                                                        , nombre_campo_ident
                                                                        , const_num));
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                    }
                }
                else
                {
                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN OPERADOR DEBE ESTAR RODEADO DE IDENTIFICADORES Y CONSTANTES"));
                }
                
            }
            else
            {
                lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN OPERADOR DEBE ESTAR RODEADO DE IDENTIFICADORES"));
            }
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 2  )
        {
            if( ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals(",") )
            {
                if( nodo.getIzquierda() == null || nodo.getDerecha()== null )
                {
                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "UN SIMBOLO DEBE ESTAR RODEADO DE IDENTIFICADORES"));
                }
            }
            else
            {
                lista_errores_actualizacion.add(new Error("CAMPOS SET", "EL SIMBOLO PERMITIDO ES LA COMA"));
            }
            
        }
        else
        {
            if ( ((Lexema)nodo.getElement()).getTipo_lexema() == 1 )
            {
                if( !((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("set"))
                {
                    System.out.println("ENTRA AQUI 1: "+((Lexema)nodo.getElement()).getLexema());
                    lista_errores_actualizacion.add(new Error("CAMPOS SET", "EXISTEN PALABRAS RESERVADAS PROHIBIDAS"));
                }
            }
            else if( ((Lexema)nodo.getElement()).getLexema()!= null
                    && ((Lexema)nodo.getElement()).getTipo_lexema()!=0 )
            {
                System.out.println("ENTRA AQUI 2: "+((Lexema)nodo.getElement()).getLexema());
                lista_errores_actualizacion.add(new Error("CAMPOS SET", "EXISTEN PALABRAS RESERVADAS PROHIBIDAS"));
            }
        }
    }


    public void recorrerSubArbolWhere(BTree nodo, BTree nodo_update )
    {
        if( nodo.getIzquierda()!= null )
        {
            recorrerSubArbolWhere(nodo.getIzquierda(), nodo_update);
        }
        if(nodo.getDerecha() != null)
        {
            recorrerSubArbolWhere(nodo.getDerecha(), nodo_update);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            int num_repitencias = 0;
            switch(buscarPuntoCadena(((Lexema)nodo.getElement()).getLexema()))
            {
                case 0:
                    num_repitencias = obj_opera_en_xml.buscarCamposEnArbol(nodo_update, ((Lexema)nodo.getElement()).getLexema());

                    if(num_repitencias > 1 )
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM"));
                    }
                    else if(num_repitencias == 0)
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                    }
                    break;

                case 1:
                    String tabla_campo = ((Lexema)nodo.getElement()).getLexema();
//                    System.out.println("PARTE TABLA"+tabla_campo.substring(0, tabla_campo.indexOf('.')));
//                    System.out.println("PARTE CAMPO"+tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() ));
                    num_repitencias = obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1,tabla_campo.length())
                                                                            , tabla_campo.substring(0, tabla_campo.indexOf('.')));

                    if(num_repitencias == 0)
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                    }
                    break;

                default:
                    lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    break;
            }
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 5)
        {
            /*
             * ACA NO SE HACE NADA PS ES CONSTANTE CADENA
             */
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 6)
        {
            /*
             * ACA NO SE HACE NADA PS ES CONSTANTE NUMERO
             */
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 3)
        {
            if(nodo.getDerecha() != null && nodo.getIzquierda() != null)
            {
                String tabla_campo = "";

                if( (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 5)
                     || (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 5
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4)
                        )
                {
                /*
                 * NOTA: ACA SE DEBE VERIFICAR SI EL CAMPO ES UNA CADENA
                 */
                    String nombre_tabla_ident = null;
                    String nombre_campo_ident = null;
                    String const_cad = null;

                    if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4 )
                    {
                        tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();
                        const_cad = ((Lexema)nodo.getDerecha().getElement()).getLexema().replace("'", "");

                    }
                    else
                    {
                        tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();
                        const_cad = ((Lexema)nodo.getIzquierda().getElement()).getLexema().replace("'", "");
                    }

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);
                                
                                if( tipo_dato_campo.equals("varchar") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo;
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                System.out.println("-----------------ESTA AQUI");
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("varchar") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length());
                                    /*
                                     * AQUI GENERA LA TABLA PARA ESTE OPERADOR
                                     */
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                        }
                    }
                    else
                    {
                        /*
                         * ERROR
                         */
                    }
                    if(nombre_tabla_ident != null && nombre_campo_ident != null )
                    {
                        Igual obj_igual = new Igual(tabla_obj_query);
                        nodo.setMatriz_query(obj_igual.generarMatrizIgualIdentConstCad(new ObjetoQuery(nombre_tabla_ident, nombre_campo_ident, null)
                                                                , const_cad));
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                    }

                }

                else if( (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 6)
                     || (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 6
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4)
                        )
                {
                /*
                 * NOTA: ACA SE DEBE VERIFICAR SI EL CAMPO ES UN NUMERO
                 */
                    String nombre_tabla_ident = null;
                    String nombre_campo_ident = null;
                    double const_num;

                    if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4 )
                    {
                        tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();
                        const_num = Double.parseDouble(((Lexema)nodo.getDerecha().getElement()).getLexema());
                    }
                    else
                    {
                        tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();
                        const_num = Double.parseDouble(((Lexema)nodo.getIzquierda().getElement()).getLexema());
                    }

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("double") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo;
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("double") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length());
                                    /*
                                     * AQUI GENERA LA TABLA PARA ESTE OPERADOR
                                     */
                                }
                                else
                                {
                                    lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }
                    if(nombre_tabla_ident != null && nombre_campo_ident != null )
                    {
                        Igual obj_igual = new Igual(tabla_obj_query);
                        nodo.setMatriz_query(obj_igual.generarMatrizIgualIdentConstNum(new ObjetoQuery(nombre_tabla_ident, nombre_campo_ident, null)
                                                                , const_num));
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                    }

                }
                else if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4 )
                {
                    /*
                     * NOTA: ACA SE DEBE VERIFICAR SI LOS DOS IDENTIFICADORES SON DEL MISMO TIPO DE DATO
                     */
                    String tipo_dato_nodo_izquierdo = "";
                    String tipo_dato_nodo_derecho = "";
                    String nombre_tabla_izq = null;
                    String nombre_tabla_der = null;
                    String nombre_campo_izq = null;
                    String nombre_campo_der = null;

                    tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_izquierdo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_izq = nombre_tabla;
                                nombre_campo_izq = tabla_campo;
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_izquierdo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_izq = nombre_tabla;
                                nombre_campo_izq = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() );
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }

                    tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_derecho = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_der = nombre_tabla;
                                nombre_campo_der = tabla_campo;
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_derecho = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_der = nombre_tabla;
                                nombre_campo_der = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() );
                            }
                            else
                            {
                                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN UPDATE"));
                            }
                        }
                        else
                        {
                            lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN FROM"));
                        }
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }

                    if( tipo_dato_nodo_derecho.equals(tipo_dato_nodo_izquierdo) )
                    {
                        /*
                         * EJECUTAR OPERADOR
                         */
                        Igual obj_igual = new Igual(tabla_obj_query);
                        nodo.setMatriz_query(obj_igual.generarMatrizIgualIdentificadores(new ObjetoQuery(nombre_tabla_izq, nombre_campo_izq, null)
                                                                  ,new ObjetoQuery(nombre_tabla_der, nombre_campo_der, null)) );
                    }
                    else
                    {
                        lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO COINCIDEN"));
                    }
                }
                else
                {
                    lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN OPERADOR DEBE ESTAR RODEADO DE IDENTIFICADORES"));
                }
            }
            else
            {
                lista_errores_actualizacion.add(new Error("CAMPOS WHERE", "UN OPERADOR DEBE ESTAR RODEADO DE IDENTIFICADORES"));
            }
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 1 
                && ( ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("and")
                    || ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("or")) )
        {
            if(lista_errores_actualizacion.isEmpty())
            {
                if(nodo.getDerecha() != null && nodo.getIzquierda() != null
                   && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 3
                   && (    ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 3
                        || ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 1) )
                {
                    if(((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("and"))
                    {
                        And obj_and = new And(nodo.getIzquierda().getMatriz_query()
                                                , nodo.getDerecha().getMatriz_query());
                        obj_and.intersectarMatrices();
                        nodo.setMatriz_query(obj_and.intersectarMatrices());
                    }
                    else
                    {
                        Or obj_or = new Or(nodo.getIzquierda().getMatriz_query()
                                                , nodo.getDerecha().getMatriz_query());
                        nodo.setMatriz_query(obj_or.unirMatrices());
                    }
                }
            }
            
        }
        else if( ((Lexema)nodo.getElement()).getTipo_lexema() == 1
                &&  ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("where") )
        {
            tabla_obj_query = nodo.getIzquierda().getMatriz_query();
            /*
             * ERROR
             */
        }
        else
        {
            /*
             * ERROR
             */
        }
    }

    public int buscarPuntoCadena(String cadena)
    {
        int numero_repitencia_punto = 0;
        for(int i = 0; i<cadena.length(); i++)
        {
            if(cadena.charAt(i) == '.')
            {
                numero_repitencia_punto++;
            }
        }
        return numero_repitencia_punto;
    }

    public void recorrerSubArbolUpdate(BTree nodo)
    {
        if( nodo.getIzquierda()!= null )
        {
            recorrerSubArbolUpdate(nodo.getIzquierda());
        }
        if(nodo.getDerecha() != null)
        {
            recorrerSubArbolUpdate(nodo.getDerecha());
        }
        if(((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            if( nodo.getDerecha() == null && nodo.getIzquierda() == null)
            {
                Archivo carchivo = new Archivo();
                carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

                if( !carchivo.getContenido_archivo().isEmpty() )
                {
                    XML xml_ = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                        ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

                    lista_def_columnas = xml_.retornarListaCampos(((Lexema)nodo.getElement()).getLexema().toLowerCase());

                    xml_ = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                        ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_dat.xml");
                    tabla_obj_query = xml_.leerArchivosDatos(((Lexema)nodo.getElement()).getLexema().toLowerCase());

                    imprimirMatriz(tabla_obj_query);
                }
                else
                {
                    lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "LA TABLA NO EXISTE"));
                }
            }
            else
            {
                lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "SOLO DEBE CONTENER UN IDENTIFICADOR DE TABLA"));
            }
        }
        else if( ((Lexema) nodo.getElement()).getTipo_lexema() == 1
                 && ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("update")
            )
        {
            if( !( ((Lexema)nodo.getDerecha().getElement()).getLexema() == null
                    && ((Lexema)nodo.getIzquierda().getElement()).getLexema() != null ))
            {
                lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "NO COMIENZA CON LA PALABRA UPDATE"));
            }

        }
        else
        {
            if( !(((Lexema) nodo.getElement()).getTipo_lexema() == 0 &&
                ((Lexema)nodo.getElement()).getLexema() == null) )
            {
                lista_errores_actualizacion.add(new Error("BLOQUE UPDATE", "LA SENTENCIA UPDATE ESTA MAL"));
            }
        }
    }

    /**
     * @return the lista_lexemas
     */
    public ArrayList getLista_lexemas() {
        return lista_lexemas;
    }

    /**
     * @param lista_lexemas the lista_lexemas to set
     */
    public void setLista_lexemas(ArrayList lista_lexemas) {
        this.lista_lexemas = lista_lexemas;
    }

}
